package bank;


import java.util.ArrayList;
import java.util.List;

import exception.KontoNichtGedecktException;
import exception.KontoNichtGefundenException;

public class Kunde extends AbstractModel {

    private static final long serialVersionUID = 101L;

    private static final String PROPERTYNAME_KUNDENNUMMER = "kundennummer";
    private static final String PROPERTYNAME_NAME = "name";
    private static final String PROPERTYNAME_KONTEN_LISTE = "kontenListe";

    private int kundennummer;
    private String name;
	private List<Konto> kontenListe;


	public Kunde(String name, int kundennummer) {
        kontenListe = new ArrayList<Konto>();
		setName(name);
		setKundennummer(kundennummer);
	}

	public int getKundennummer() {
		return kundennummer;
	}

	public void setKundennummer(int aNewValue) {
	    int oldValue = getKundennummer();
		kundennummer = aNewValue;
		firePropertyChange(PROPERTYNAME_KUNDENNUMMER, oldValue, getKundennummer());
	}

	public String getName() {
		return name;
	}

	public void setName(String aNewValue) {
	    String oldValue = getName();
        name = aNewValue;
        firePropertyChange(PROPERTYNAME_NAME, oldValue, getName());
	}

    /**
     * Um der Liste neue Elemente hinzuzufügen sollte {@link #anlegenKonto(int)}
     * aufgerufen werden.
     */
    public List<Konto> getKontenListe() {
        return kontenListe;
    }

    public Konto anlegenKonto(int kontoArt) {
        int kontoNummer = (getKundennummer() * 100 + kontoArt) * 1000 + kontenListe.size() + 1;
        Konto konto = Konto.neuesKonto(kontoNummer, kontoArt);
        addKonto(konto);
        return konto;
    }

    private void addKonto(Konto aKonto) {
        getKontenListe().add(aKonto);
        firePropertyChange(PROPERTYNAME_KONTEN_LISTE, null, getKontenListe());
    }

	public String anzeigenKontostandsUebersicht() {
		String out = "Kontostandsübersicht von Kontoinhaber " + name;
		for (Konto k : kontenListe) {
			out += "\nKontonummer: "+ k.getKontonummer() + "\tKontostand: " + k.getKontostand() + "\nKontobewegungen";
			for (Kontobewegung b : k.getMeineKontobewegungen()) {
				out += "\n\t" + b.getDatum() + ", " + b.getBetrag();
			}
		}
		return out;
	}

    public double getKontostand(int kontonummer) throws KontoNichtGefundenException {
        return getKonto(kontonummer).getKontostand();
    }

    public double getGesammtKontostand() {
        double kontostand = 0;
        for (Konto konto : kontenListe) {
            kontostand += konto.getKontostand();
        }
        return kontostand;
    }

	public double auszahlenBetrag(int kontonummer, double betrag) throws KontoNichtGefundenException, KontoNichtGedecktException {
	    Konto konto = getKonto(kontonummer);
	    konto.auszahlen(betrag);
		return konto.getKontostand();
	}

	public double einzahlenBetrag(int kontonummer, double betrag) throws KontoNichtGefundenException {
	    Konto konto = getKonto(kontonummer);
	    konto.einzahlen(betrag);
		return konto.getKontostand();
	}

	public Konto getKonto(int vonKontoNr) throws KontoNichtGefundenException {
		for (Konto konto : kontenListe) {
			if (konto.getKontonummer() == vonKontoNr) {
				return konto;
			}
		}
		throw new KontoNichtGefundenException(vonKontoNr);
	}
}
